// ALERT: 此代码中的栈
//  1. 使用的是顺序栈；
//  2. 栈顶指针的初值认为是-1

#include <stdio.h>

#define MaxSize 50

typedef int ElemType;


typedef struct {
	// 顺序栈用数组实现
	ElemType data[MaxSize];
	// 栈顶指针用整型变量实现
	int top;
} SqStack;


// FUNCTION: 初始化栈
void InitStack(SqStack &S) {
	S.top = -1;
}


// FUNCTION: 判栈空
bool isEmpty(SqStack S) {
	if (S.top == -1) {
		return true;
	} else {
		return false;
	}
}


// FUNCTION: 判栈满
bool isFull(SqStack S) {
	if (S.top == MaxSize - 1) {
		return true;
	} else {
		return false;
	}
}


// FUNCTION: 入栈
// @param: val代表入栈元素的值
bool Push(SqStack &S, ElemType val) {
	// NOTE: 入栈合法性检查
	if (isFull(S)) {
		return false;
	}


	// NOTE: 入栈操作
	S.data[++S.top] = val;

	return true;
}


// FUNCTION: 出栈
// @param: val代表出栈元素的值
bool Pop(SqStack &S, ElemType &val) {
	// NOTE: 出栈合法性检查
	if (isEmpty(S)) {
		return false;
	}


	// NOTE: 出栈操作
	val = S.data[S.top--];

	return true;
}


// FUNCTION: 读取栈顶元素
// @param: ElemType代表出栈元素的值
bool GetTop(SqStack S, ElemType &val) {
	// NOTE: 读取合法性检查
	if (isEmpty(S)) {
		return false;
	}

	// NOTE: 读取操作
	val = S.data[S.top];

	return true;
}


int main() {
	setbuf(stdout, NULL);


	// NOTE: Variable declaration
	// STEP: 定义栈结构体类型
	SqStack S;

	// STEP: 定义变量，ElemType类型，用于存放弹栈元素值
	ElemType value;


	// NOTE: 初始化栈
	printf("Stack initiating...\n");
	InitStack(S);
	printf("Initiation finished.\n");

	printf("Whether stack is empty, or not?\n");
	if (isEmpty(S)) {
		printf("Stack is empty.\n");
	} else {
		printf("Stack is not empty yet!\n");
	}


	// NOTE: 数据压栈
	Push(S, 3);
	Push(S, 4);
	Push(S, 5);


	// NOTE: 取栈顶元素
	printf("Getting the top element of stack...\n");
	if (GetTop(S, value)) {
		printf("Top element value is %d\n", value);
	}


	// NOTE: 弹出栈顶元素值
	printf("Popping the top element of stack...\n");
	if (Pop(S, value)) {
		printf("Top element popped. Its value is %d\n", value);
	} else {
		printf("Top element pops failed!\n");
	}


	return 0;
}